/**
 * @name: 为了兼容小程序 props 传function this指向子组件问题，用此方法触发
 * @param {String} propName props名称
 * @param {Array} args 参数
 * @return {*}
 * @example: this.$triggerPropsFn('beforeShow',param);
 */
export default function triggerPropsFn(propName, ...args) {
  if (typeof this[propName] === 'function') {
    // #ifdef MP
    let parent = this.$parent;
    while (parent) {
      const methodsKeys = Object.keys(parent.$options.methods || {});
      // 微信小程序中props中的方法是 使用的父级vm.$options.methods上的方法，没有绑定this
      const parentOptionsMethodsList = methodsKeys.map(key => parent.$options.methods[key]);
      if (parentOptionsMethodsList.includes(this[propName])) {
        // 返回指向 使用该组件父级vm的方法
        return this[propName].bind(parent)(...args);
      } else {
        parent = parent.$parent;
      }
    }
    // #endif
    return this[propName](...args);
  }
}
